/**
 * JuegoScreen.java
 * 
 * @version 1.0
 *
 * 11/21/2011
 * 
 * AOI
 */

package com.jcj.jumper;

import com.jcj.framework.Game;
import com.jcj.framework.Input.TouchEvent;
import com.jcj.framework.gl.Camera2D;
import com.jcj.framework.gl.SpriteBatcher;
import com.jcj.framework.gl.Texture;
import com.jcj.framework.gl.TextureRegion;
import com.jcj.framework.impl.GLScreen;
import com.jcj.framework.math.OverlapTester;
import com.jcj.framework.math.Rectangle;
import com.jcj.framework.math.Vector2;
import java.util.List;
import javax.microedition.khronos.opengles.GL10;

	/**
	 * En esta clase se declaran los recursos y variables a utilizar en la pantalla del tablero principal
	 * 
	 *@author AOI
	 *
	 *@version 1.0
	 *
	 */

public class JuegoScreen extends GLScreen {
    Camera2D guiCam;
    SpriteBatcher batcher;
    Rectangle nextBounds;
    Rectangle back;
    Vector2 touchPoint;
    Texture helpImage;
    TextureRegion helpRegion;
    boolean turno;
    Rectangle dado;
    boolean muestradado;
    boolean definedado;
    int valordado;
    int valorinicio;
    boolean algo;
    
    /**
     * @param game es un objeto tipo game que se importa de framework necesario para la creacion del juego,
     * lo recibe este metodo.
     * Inicializa rectangulos, boolean y vectores que se utilizan para el tablero.
     */
    
    public JuegoScreen(Game game,int valorinicio) {
        super(game);
        this.valorinicio=valorinicio;
        algo=false;
        turno = true;
        guiCam = new Camera2D(glGraphics, 320, 480);
        nextBounds = new Rectangle(320 - 64, 0, 64, 64);
        touchPoint = new Vector2();
        batcher = new SpriteBatcher(glGraphics, 50);
        back = new Rectangle(180, 435, 170, 30);
    }
   
    /** Este metodo se utiliza en cada clase de los juegos y minijuegos
     *  Es para reanudar el juego despues de un estado de pausa
     */
    
    @Override
    public void resume() {
        helpImage = new Texture(glGame, "help1.png");
        helpRegion = new TextureRegion(helpImage, 0, 0, 320, 480);
    }
    
    /**
     * Este metodo indica lo que debe de hacer en caso de que se presione pausa
     */

    @Override
    public void pause() {
        helpImage.dispose();
    }
    
    /**
     * Este metodo actualiza el dado principalmente, ademas lee si hay algún touchevent y compara si 
     * intersecta algún rectangulo para correr el metodo correspondiente, dependiendo de que tipo de casilla, manda
     * a un minijuego, o existen 3 tipos distintos, una casilla te regresa 5 espacios, otra casilla te baja 1 
     * espacio y una casilla te sube un espacio
     */
    
    @Override
    public void update(float deltaTime) {
    	
    	if(algo==true){
    		
    	switch(valorinicio) {
    	case 1: game.setScreen (new Creacionbandera (game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 2: game.setScreen (new Numeros (game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 3: game.setScreen (new Game1 (game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 4: this.valorinicio = valorinicio+1;
    	break;
    	case 5: game.setScreen(new Creacionbandera(game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 6: this.valorinicio = valorinicio-1;
    	//turno=true;
    	break;
    	case 7: this.valorinicio = valorinicio-5;
    	//turno=true;
    	break;
    	case 8:game.setScreen (new Numeros (game, 3 , 0, true, valorinicio, valordado));
    	break;
    	case 9: this.valorinicio = valorinicio+1;
    	break;
    	case 10: game.setScreen (new Numeros (game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 11: game.setScreen (new Game1 (game, 3, 0, true, valorinicio, valordado));
    	break;
    	case 12: this.valorinicio = valorinicio-1;
    	break;
    	}
    	}	
        List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
        game.getInput().getKeyEvents();
        int len = touchEvents.size();
        
        for (int i = 0; i < len; i++) {
            TouchEvent event = touchEvents.get(i);
            touchPoint.set(event.x, event.y);
        	guiCam.touchToWorld(touchPoint);

            if (event.type == TouchEvent.TOUCH_UP) {
            	if (OverlapTester.pointInRectangle(nextBounds, touchPoint)) {
                    Assets.playSound(Assets.clickSound);
                    game.setScreen(new HelpScreen2(game));
                    return;
                }
                
                if (OverlapTester.pointInRectangle(back, touchPoint)) {
                    Assets.playSound(Assets.clickSound);
                    game.setScreen(new MainMenuScreen(game));
                    return;
                }
                
                if (OverlapTester.pointInRectangle(dado, touchPoint)) {
                	if (turno==true) {
                		turno = false;
                		muestradado = true;
                		Assets.playSound(Assets.clickSound);
                		return;
                	}
                	
                   if (muestradado == true){
                	   muestradado = false;
                	   valordado = (int) (Math.random() * 5)+1;
                	   valorinicio = valorinicio + valordado;
                	   definedado = true;
                   }
                }
            }
        }
    }
    
    /**
     * Este metodo pinta todas las casillas que se van a utilizar en el tablero principal, asi como el 
     * jugador y el dado
     */
    
    @Override
    public void present(float deltaTime) {
        GL10 gl = glGraphics.getGL();
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        guiCam.setViewportAndMatrices();

        gl.glEnable(GL10.GL_TEXTURE_2D);
        batcher.beginBatch(Assets.background);
        batcher.drawSprite(160, 240, 320, 480, Assets.backgroundRegion);
        batcher.endBatch();
     

        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);


        batcher.beginBatch(Assets.Textures);
	    	batcher.drawSprite(37, 24, 76, 45, Assets.landingSpace1);
	    	batcher.drawSprite(119, 24, 76, 45, Assets.landingSpace2);
	    	batcher.drawSprite(200, 24, 76, 45, Assets.landingSpace3);
	    	batcher.drawSprite(282, 24, 76, 45, Assets.landingSpace4);
	    	batcher.drawSprite(283, 223, 76, 45, Assets.landingSpace5);
	    	batcher.drawSprite(200, 223, 76, 45, Assets.landingSpace6);
	    	batcher.drawSprite(119, 223, 76, 45, Assets.landingSpace3);
	    	batcher.drawSprite(37, 223, 76, 45, Assets.landingSpace1);
	    	batcher.drawSprite(297, 86, 45, 76, Assets.landingSpaceV1);
	    	batcher.drawSprite(297, 160, 45, 76, Assets.landingSpaceV2);
	    	batcher.drawSprite(21, 286, 45, 76, Assets.landingSpaceV3);
	    	batcher.drawSprite(23, 363, 45, 76, Assets.landingSpaceV4);
	    	batcher.drawSprite(23, 435, 45, 76, Assets.landingSpaceV5);
	    	batcher.drawSprite(240, 460, 150, 25, Assets.MenuPrincipal);
	    	switch(valorinicio){
	    	case 0: batcher.drawSprite(30, 30, 13, 27, Assets.player);
	    	break;
	    	case 1: batcher.drawSprite(119, 30, 13, 27, Assets.player);
	    	break;
	    	case 2: batcher.drawSprite(200, 30, 13, 27, Assets.player);
	    	break;
	    	case 3: batcher.drawSprite(282, 30, 13, 27, Assets.player);
	    	break;
	    	case 4: batcher.drawSprite(297, 86, 13, 27, Assets.player);
	    	break;
	    	case 5: batcher.drawSprite(297, 160, 13, 27, Assets.player);
	    	break;
	    	case 6: batcher.drawSprite(282, 223, 13, 27, Assets.player);
	    	break;
	    	case 7: batcher.drawSprite(200, 223, 13, 27, Assets.player);
	    	break;
	    	case 8: batcher.drawSprite(119, 223, 13, 27, Assets.player);
	    	break;
	    	case 9: batcher.drawSprite(30, 30, 13, 27, Assets.player);
	    	break;
	    	case 10: batcher.drawSprite(23, 286, 13, 27, Assets.player);
	    	break;
	    	case 11: batcher.drawSprite(23, 363, 13, 27, Assets.player);
	    	break;
	    	case 12: batcher.drawSprite(23, 435, 13, 27, Assets.player);
	    	break;
	    	}
	    	
        batcher.endBatch();
        
        if (turno == true) {
        	batcher.beginBatch(Assets.meteoritos);
        	batcher.drawSprite(160, 240, 80, 80, Assets.presiona);
        	batcher.endBatch();
        	dado = new Rectangle(120, 200, 80, 80);
        	        	
        }
        
        if (muestradado == true) {
        	batcher.beginBatch(Assets.meteoritos);
            batcher.drawSprite(160, 240, 80, 80, Assets.arreglo[(int) (Math.random() * 5)]);
            batcher.endBatch();
            dado = new Rectangle(120, 200, 80, 80);
        }
        
        if (definedado == true) {
        	batcher.beginBatch(Assets.meteoritos);
            batcher.drawSprite(160, 240, 80, 80, Assets.arreglo[valordado-1]);
            batcher.endBatch();
         algo=true;   
        }

        gl.glDisable(GL10.GL_BLEND);
    }

    
    @Override
    public void dispose() {
        
    }
}
